package top.szhome.framework.core.tools.support;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.util.Map;

/**
 * 响应对象
 *
 * @author 唐加利
 * @date 2023/7/24
 **/
@Data
public class Resp<T> {

    /**
     * 响应码-成功
     */
    public static final String RESPONSE_SUCCESS = "200";

    /**
     * 响应码，响应码200表示请求成功，否则表示请求失败
     */
    @Schema(example = RESPONSE_SUCCESS, description = "请求响应编码，200表示请求成功，否则请求失败")
    private String errorCode;

    /**
     * 响应消息
     */
    @Schema(example = "操作成功", description = "请求响应消息，一般code为200时消息为空，否则表示请求失败原因")
    private String errorMessage;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 扩展数据
     */
    @Schema(example = "扩展信息", description = "请求响应扩展信息")
    private Map<String, Object> ext;

    /**
     * 默认响应
     */
    public Resp(){
        this(RESPONSE_SUCCESS, null);
    }

    /**
     * 构造指定响应数据的响应
     * @param data
     */
    public Resp(T data) {
        this(RESPONSE_SUCCESS, null, data);
    }

    /**
     * 只有响应消息信息的响应
     * @param errorCode
     * @param errorMessage
     */
    public Resp(String errorCode, String errorMessage) {
        this(errorCode, errorMessage, null);
    }

    /**
     * 构造无附带消息的响应
     * @param errorCode
     * @param errorMessage
     * @param data
     */
    public Resp(String errorCode, String errorMessage, T data){
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
        this.data = data;
    }

    /**
     * 判断响应是否成功
     * @return
     */
    public boolean isSuccess(){
        return RESPONSE_SUCCESS.equals(errorCode);
    }

    /**
     * 响应成功，并返回响应数据
     * @param <T>
     * @return
     */
    public static <T> Resp<T> success() {
        return new Resp<>();
    }

    /**
     * 响应成功，并返回响应数据
     * @param data
     * @param <T>
     * @return
     */
    public static <T> Resp<T> success(T data) {
        return new Resp<>(data);
    }

    /**
     * 响应失败
     * @param code
     * @return
     */
    public static Resp fail(String code){
        return new Resp(code, null);
    }

    /**
     * 响应失败，并指定响应消息
     *
     * @param code
     * @param message
     * @return
     */
    public static Resp fail(String code, String message) {
        return new Resp(code, message);
    }
}
